#include "string.h"
#include "global.h"
#include "debug.h"

// 将 dest 起始的 size 个字节设置为 value
void memset(void* dest, uint8_t value, uint32_t size) {
    ASSERT(dest != NULL);
    uint8_t* dst = (uint8_t*) dest;
    while(size-- > 0) *dst++ = value;
}

// 将 src 起始的 size 个字节复制到 dest
void memcpy(void* dest, const void* src_, uint32_t size) {
    ASSERT(dest != NULL && src_ != NULL);
    uint8_t* dst = dest;
    const uint8_t* src = src_;
    while(size-- > 0) *dst++ = *src++;
}

// 比较两个字符串前 size 个，a=b 0, a>b 1, a < b -1
int memcmp(const void* a_, const void* b_, uint32_t size) {
    const char* a = a_;
    const char* b = b_;
    while(size-- > 0) {
        if(*a != *b) return *a > *b ? 1 : -1;
        a++;
        b++;
    }
    return 0;
}

// 将字符串从 src 复制到 dest，并且返回 dest 的地址
char* strcpy(char* dst_, const char* src_) {
    ASSERT(dst_ != NULL && src_ != NULL);
    char* r = dst_;
    while((*dst_++ = *src_++));
    return r;
}

// 返回字符串长度
uint32_t strlen(const char* str) {
    ASSERT(str != NULL);
    const char* p = str;
    while(*p++);
    return p - str - 1;
}

// 比较两个字符串, a=b 0, a>b 1, a < b -1
int8_t strcmp(const char* a, const char* b) {
    ASSERT(a != NULL && b != NULL);
    while(*a != 0 && *a == *b) {
        a++;
        b++;
    }
    return *a > *b ? 1 : -1;
}

// 从左到右查找字符串 str 中首次出现字符 ch 的地址
char* strchr(const char* str, const uint8_t ch) {
    ASSERT(str != NULL);
    while(*str != 0) {
        if(*str == ch) return (char*) str;
        str++;
    }
    return NULL;
}

// 从后往前查找字符串 str 中首次出现字符 ch 的地址
char* strrchr(const char* str, const uint8_t ch) {
    ASSERT(str != NULL);
    const char* res = NULL;
    while(*str != 0) {
        if(*str == ch) res = str;
        str++;
    }
    return (char*) res;
}

// 在字符串中查找字符 ch 出现的次数
uint32_t strchrs(const char* str, uint8_t ch) {
    ASSERT(str != NULL);
    uint32_t ch_cnt = 0;
    const char* p = str;
    while(*p != 0) {
        if(*p == ch) ch_cnt++;
        p++;
    }
    return ch_cnt;
}

